package App;

import java.util.ArrayList;
import java.util.List;

import juani.CondicionDeCompra;
import juani.Financiacion;
import juani.Item;
import juani.Vigencia;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class LeerXML {

	private Document documentoXML;
	
	public LeerXML(Document lista){
			
		try {
			documentoXML = lista;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	// Devuelve el nodo raiz del docuemento que le pasas por parametro al constructor de la clase.	
     public Element getRaiz(){ 
		return documentoXML.getDocumentElement();
	}
	
  // Recorre todo el arbol y va devolviendo los valores de cada nodo.		
	public void leerTodoslosElementos(){ 
		Element raiz = this.getRaiz();
		System.out.printf("Nombre raiz: %s\n", raiz.getTagName());
		if (raiz.hasChildNodes())
			GetHijosNodo(raiz);
	}
			
	void GetHijosNodo(Node nodo){ //Devuelve todos los nodos hijos de un nodo padre(incluso raiz) pasado por parametro.
			
			NodeList nodos = nodo.getChildNodes();
			String valor;
			for (int i = 0; i < nodos.getLength(); i++){
				Node child = nodos.item(i);
				valor = (child.getNodeType()==Node.TEXT_NODE?child.getNodeValue():child.getNodeName());
				if (!valor.startsWith("\n")){  // todo contenido de nodo que arranca con \n lo ignora ya que indica el camino a nivel inverior, ya que indica el camino a niveles inferiores.
					System.out.printf("\n - Nodo %s: %s \n",i,valor);
				}
				if(nodos.item(i).hasChildNodes()) // Se mete un nivel mas para buscar los hijos de los elementos.
					GetHijosNodo(nodos.item(i));
			}
		}
	
//Le pasas el nombre del nodo que contiene la info que buscas, por ejemplo rodamiento.
//Adentro del metodo le pasas la parte del nodo que queres.
	public void leerElementosXTagName(String NombreNodo){
		NodeList lista = this.getRaiz().getElementsByTagName(NombreNodo);
		for (int i=0;i<lista.getLength();i++){
			Element e = (Element)lista.item(i);
			//Leo todos los atributos que quiero aca:
			NodeList hijos =e.getElementsByTagName("Origen");
			for (int j=0;j<hijos.getLength();j++){
				Element e2 = (Element) hijos.item(j);
				this.leerNodosPrincipales(e2);
			}
		}
	}

//Lee todos los elementos principales de un nodo (hijos)
	public void leerNodosPrincipales(Element e){
		NodeList nodos = e.getChildNodes();
		String valor;
		for (int i = 0; i < nodos.getLength(); i++){
			Node child = nodos.item(i);
			valor = (child.getNodeType()==Node.TEXT_NODE?child.getNodeValue():child.getNodeName());
			if (!valor.startsWith("\n")){  // todo contenido de nodo que arranca con \n lo ignora ya que indica el camino a nivel inverior, ya que indica el camino a niveles inferiores.
				System.out.printf("\n - Nodo %s: %s \n",i,valor);
			}
		} 
	}

	//Lee todos los elementos del nivel uno del arbol.
	public void leerNodosPrincipales(){ 
		Element raiz = this.getRaiz();		
		NodeList nodos = raiz.getChildNodes();
		String valor;
		for (int i = 0; i < nodos.getLength(); i++){
			Node child = nodos.item(i);
			valor = (child.getNodeType()==Node.TEXT_NODE?child.getNodeValue():child.getNodeName());
			if (!valor.startsWith("\n")){  // todo contenido de nodo que arranca con \n lo ignora ya que indica el camino a nivel inverior, ya que indica el camino a niveles inferiores.
				System.out.printf("\n - Nodo %s: %s \n",i,valor);
			}
		} 
		}
	//*----------------3-06
	//Le pasas el nodo que queres y dentro de ese nodo que elemento queres capturar.
	public String BuscarElemento(String NombreNodo, String nombreElemento){
		
		NodeList lista = this.getRaiz().getElementsByTagName(NombreNodo);
			Element e = (Element)lista.item(0); // Va a cada uno de los elementos = Nombre nodo
			//Leo todos los atributos que quiero aca:
			NodeList hijos =e.getElementsByTagName(nombreElemento);
			
			Element e2 = (Element) hijos.item(0);
			NodeList nodos = e2.getChildNodes();
			String valor;
			
			Node child = nodos.item(0);
			valor = (child.getNodeType()==Node.TEXT_NODE?child.getNodeValue():child.getNodeName());
			
			if (!valor.startsWith("\n")){  // todo contenido de nodo que arranca con \n lo ignora ya que indica el camino a nivel inverior, ya que indica el camino a niveles inferiores.
					System.out.printf("\n - Nodo %s: %s \n",1,valor);
					}
			return valor;
	}
	
	/*Lee todos los */
	public void BuscarElementoS(String NombreNodo, String nombreElemento){
		NodeList lista = this.getRaiz().getElementsByTagName(NombreNodo); /*Capturo toda la lista de items*/
		for (int i=0;i<lista.getLength();i++){ 
			Element e = (Element)lista.item(i); // Va a cada uno de los elementos = Nombre nodo
			//Leo todos los atributos que quiero aca:
			NodeList hijos =e.getElementsByTagName(nombreElemento); /*Captuo las marcas*/
			
			for (int j=0;j<hijos.getLength();j++){
				Element e2 = (Element) hijos.item(j);
				this.leerNodosPrincipales(e2);
				}
		}
}
	
	/**********Leer nodos principales***********/
	/*
	System.out.printf("\n -Nombre raiz: %s\n",e.getTagName());
	
	NodeList nodos = e.getChildNodes();
	String valor;
	for (int i = 0; i < nodos.getLength(); i++){
		Node child = nodos.item(i);
		valor = (child.getNodeType()==Node.TEXT_NODE?child.getNodeValue():child.getNodeName());
		
		if (!valor.startsWith("\n")){  // todo contenido de nodo que arranca con \n lo ignora ya que indica el camino a nivel inverior, ya que indica el camino a niveles inferiores.
			System.out.printf("\n - Nodo %s: %s \n",i,valor);
		}
	} 
	
	*/
	/********************************************Aplicaciones******************************************/
	/*************************************************************************************************************/
	/*************************************************************************************************************/
	
	
	public List<Item> getItemRodamiento(){
		
		Element root = this.getRaiz();
		NodeList n= root.getElementsByTagName("Item");
		List<Item> items = new ArrayList<Item>();
		
		for(int i=0; i<n.getLength(); i++){
			Element e = (Element)n.item(i);
			Item it = new Item();
			NodeList marcas = e.getElementsByTagName("Marca");
			NodeList origenes = e.getElementsByTagName("Origen");
			NodeList precios = e.getElementsByTagName("Precio");
			
			it.setOrigen(origenes.item(0).getFirstChild().getNodeValue());
			it.setPrecio(Double.valueOf(precios.item(0).getFirstChild().getNodeValue()));
			it.setMarca(marcas.item(0).getFirstChild().getNodeValue());
			it.setSerie(Integer.valueOf(e.getAttribute("serie")));
			it.setSufijo(e.getAttribute("sufijo"));
			
			items.add(it);
			}
		
		return items;
	}
	
	
	public Proveedor getProveedor(){
		Element root = this.getRaiz();
		NodeList n= root.getElementsByTagName("Proveedor");
		Proveedor p = new Proveedor();
		for(int i=0; i<n.getLength(); i++){
			Element e = (Element)n.item(i);
			p.setCuil(e.getElementsByTagName("Cuit").item(0).getFirstChild().getNodeValue());
			p.setRazonSocial(e.getElementsByTagName("RazonSocial").item(0).getChildNodes().item(0).getNodeValue());
			}
		
		return p;
	}
	
	
	
	
	
	
	
	public  ArrayList<Financiacion> getFinanciacion(String NombreNodo){
		
		Element root = this.getRaiz();
		NodeList n= root.getElementsByTagName(NombreNodo);
		Financiacion f= new Financiacion();
		ArrayList<Financiacion> financiaciones= new ArrayList<Financiacion>();
		
		
		for(int i=0; i<n.getLength(); i++){
			Element e = (Element)n.item(i);
			
			f.setCantDias(Integer.valueOf(e.getAttribute("dias")));
			f.setRecargo(Integer.valueOf(e.getElementsByTagName("Recargo").item(0).getFirstChild().getNodeValue()));
				    	
			financiaciones.add(f);
			}
		
		return financiaciones;
	}
	
	public ArrayList<CondicionDeCompra> getCondicionesCompraListado(){
		// FormaPago, Plazo, Intereses,Descuento
		
		Element root = this.getRaiz();
		NodeList n= root.getElementsByTagName("CondicionDeCompra");
		
		CondicionDeCompra c = new CondicionDeCompra();
		ArrayList<CondicionDeCompra> condiciones = new ArrayList<CondicionDeCompra>();
		
		for(int i=0; i<n.getLength(); i++){
			Element e = (Element)n.item(i);
			
						NodeList formasPago = e.getElementsByTagName("FormaPago");
						NodeList plazos = e.getElementsByTagName("Plazo");
						NodeList intereses = e.getElementsByTagName("Intereses");
						NodeList descuentos = e.getElementsByTagName("Descuento");
						
						c.setDescuento(Double.valueOf(descuentos.item(0).getFirstChild().getNodeValue()));
						c.setPlazo(plazos.item(0).getFirstChild().getNodeValue());
						c.setIntereses(Double.valueOf(intereses.item(0).getFirstChild().getNodeValue()));
						c.setFormaPago(formasPago.item(0).getFirstChild().getNodeValue());
						
						condiciones.add(c);
													
		}
		
		return condiciones;
		
	
		
	}
	
	
	public Vigencia getVigenciaListadoPrecio(){
		
		Element root = this.getRaiz();
		NodeList n= root.getElementsByTagName("Vigencia");
		
		Vigencia v = new Vigencia();
		
			
		for(int i=0; i<n.getLength(); i++){
			Element e = (Element)n.item(i);
			v.setFechaDesde(e.getElementsByTagName("FechaDesde").item(0).getFirstChild().getNodeValue());
			v.setFechaHasta(e.getElementsByTagName("FechaHasta").item(0).getFirstChild().getNodeValue());
		}
		
		return v;
		
		
		
	}
	
	
	
	public int getNroListado(){
	return Integer.valueOf(this.getRaiz().getAttribute("numero"));
	}
	
	
	
	
}
